home *** CD-ROM | disk | FTP | other *** search
/ Magnum One / Magnum One (Mid-American Digital) (Disc Manufacturing).iso / d11 / crt_sav4.arc / CRT_SAVE.ASM next >
Assembly Source File  |  1988-04-04  |  10KB  |  353 lines

  1. ; CRT_SAVE VERSION 1.4 03/15/88
  2. ;
  3. CSEG     SEGMENT para public 'CODE'
  4.          ASSUME  CS:CSEG,DS:CSEG
  5. ;
  6.          ORG   100H
  7. ;
  8. START:   JMP   INIT
  9. ;
  10. CR             EQU  0DH
  11. LF             EQU  0AH
  12. BEL            EQU  07H
  13. COPYRIGHT DB "CRT_Save 1.4 (c) 1988 RAMSYS MicroSystems$",1Ah
  14.           DB "By Radu V. Metea"
  15. ;
  16. TIMER_BIOS     DD   0             ;timer interrupt address    1C
  17. KBD_BIOS       DD   0             ;keyboard interrupt address 09
  18. VIDEO_BIOS     DD   0             ;video interrupt address    10
  19. ;
  20. SWFLAG         DB   0             ;video on (1 if off)
  21. KEYFLAG        DB   0             ;no kbd/video since video off
  22. COUNT          DW   0             ;timer count
  23. UPP_FLAG       DB   0             ;save caps lock status
  24. EGA_FLAG       DB   0             ;if EGA adapter
  25. TIME           dw   2200H         ;minutes to blank screen
  26. ;                                  18.2 * 60 * 8 = 8 minutes
  27. ;
  28. TIMER_INT      EQU  01CH          ;timer interrupt
  29. KBD_INT        EQU  009H          ;keyboard interrupt
  30. VIDEO_INT      EQU  010H          ;video interrupt
  31. ;
  32. ADDR_6845      EQU  063H          ;video adapter port base address
  33. CRT_MODE_SET   EQU  065H          ;current state of CRT mode register
  34. seventeen      equ  0017H         ;Keyboard flag 0 offset
  35. forty          equ  0040H         ;caps lock flag
  36. PAGE
  37. ;
  38. ;         <EGA Screen on/off procedure>
  39. ;
  40.          EVEN
  41. SCREEN_ON:         MOV    AL,20h
  42.                    JMP    Short SCREEN_IO
  43.  
  44. SCREEN_OFF:        MOV    AL,0
  45.  
  46. SCREEN_IO:         PUSH   DX
  47.                    PUSH   AX
  48.                    MOV    DX,03BAh
  49.                    IN     AL,DX                ; Reset mono flip-flop
  50.                    MOV    DL,0DAh
  51.                    IN     AL,DX                ; Reset color flip-flop
  52.                    MOV    DL,0C0h              ; Attribute port
  53.                    POP    AX                   ; Get on/off pattern
  54.                    OUT    DX,AL                ; Turn screen on or off
  55.                    POP    DX
  56.                    RET
  57. ;
  58. ;        INT 1CH (TIMER TICK)
  59. ;
  60.          EVEN
  61. TIMER_TICK:
  62. ;
  63.          sti
  64.          push  AX
  65.          push  DS
  66.          push  CS
  67.          pop   DS
  68.          cmp   swflag,0
  69.          JNE   T01
  70.          inc   count
  71.          mov   ax,time
  72.          cmp   AX,count           ;time to blank out?
  73.          JG    T02
  74.          mov   count,0
  75.          cmp   CS:ega_flag,1
  76.          JNE   T0
  77.          CALL  SCREEN_OFF
  78.          JMP   T1
  79. T0:
  80.          push  DX
  81.          push  ES
  82.          mov   AX,0040H
  83.          mov   ES,AX
  84.          mov   DX,ES:ADDR_6845
  85.          add   DX,4
  86.          mov   AL,ES:CRT_MODE_SET
  87.          and   AL,11110111B
  88.          out   DX,AL
  89.          pop   ES
  90.          pop   DX
  91. T1:
  92.          mov   swflag,1
  93.          JMP   SHORT T02
  94. ;
  95. T01:
  96.          cmp   keyflag,0
  97.          JE    T02
  98.          cmp   CS:ega_flag,1
  99.          JNE   T010
  100.          CALL  SCREEN_ON
  101.          JMP   T011
  102. T010:
  103.          push  DX
  104.          push  ES
  105.          mov   AX,0040H
  106.          mov   ES,AX
  107.          mov   DX,ES:ADDR_6845
  108.          add   DX,4
  109.          mov   AL,ES:CRT_MODE_SET
  110.          out   DX,AL
  111.          pop   ES
  112.          pop   DX
  113. T011:
  114.          mov   keyflag,0
  115.          mov   swflag,0
  116.          mov   count,0
  117. ;
  118. T02:
  119.          pop   DS
  120.          pop   AX
  121.          pushf
  122.          CLI
  123.          CALL  CS:TIMER_BIOS
  124.          IRET
  125. ;
  126. PAGE
  127. ;
  128. ;        INT 09H (KEYBOARD)
  129. ;
  130.          EVEN
  131. KEYBOARD:
  132.          sti
  133.          push  AX
  134.          push  DS
  135.          push  CS
  136.          pop   DS
  137.          push  AX
  138.          push  BX
  139.          push  CX
  140.          push  DS
  141. ;
  142.          mov   AX,forty                        ;BIOS flags segment
  143.          mov   DS,AX                           ;kbd status flag segment
  144.          mov   AL,BYTE PTR DS:seventeen        ;kbd flags
  145.          and   AL,forty                        ;turn off other
  146.          cmp   BYTE PTR CS:upp_flag,AL         ;did it change?
  147.          mov   BYTE PTR CS:upp_flag,AL         ;save new value
  148.          JE    DONT_BEEP                       ;no, don't beep
  149.          test  BYTE PTR DS:seventeen,forty     ;caps on?
  150.          JZ    DONT_BEEP                       ;no, don't beep
  151. ;
  152.          IN    AL,61H
  153.          MOV   BX,0020H
  154. ;
  155. LP1:     AND   AL,0FCH
  156.          OR    AL,02H
  157.          OUT   61H,AL
  158.          MOV   CX,0100H
  159. LP2:     NOP
  160.          LOOP  LP2
  161.          AND   AL,0FCH
  162.          OUT   61H,AL
  163.          MOV   CX,0100H
  164. LP3:     NOP
  165.          LOOP  LP3
  166.          DEC   BX
  167.          JNE   LP1
  168.          AND   AL,0FCH
  169.          OUT   61H,AL
  170. ;
  171. DONT_BEEP:
  172. ;
  173.          pop   DS
  174.          pop   CX
  175.          pop   BX
  176.          pop   AX
  177. ;
  178.          cmp   swflag,0
  179.          JE    K01
  180.          mov   keyflag,1
  181.          CLI
  182.          INT   TIMER_INT
  183. ;
  184. K01:
  185.          mov   count,0
  186.          pop   DS
  187.          pop   AX
  188.          pushf
  189.          CLI
  190.          CALL  CS:KBD_BIOS
  191.          IRET
  192. ;
  193. PAGE
  194. ;
  195. ;        INT 10H (VIDEO)
  196. ;
  197.          EVEN
  198. VIDEO:
  199.          sti
  200.          push  AX
  201.          push  DS
  202.          push  CS
  203.          pop   DS
  204.          cmp   swflag,0
  205.          JE    V01
  206.          mov   keyflag,1
  207.          CLI
  208.          INT   TIMER_INT
  209. ;
  210. V01:
  211.          mov   count,0
  212.          pop   DS
  213.          pop   AX
  214.          pushf
  215.          CLI
  216.          CALL  CS:VIDEO_BIOS
  217.          IRET
  218. ;
  219. END_RESIDENT:
  220. ;
  221. ;        INITIALIZATION LOGIC
  222. ;
  223. INIT:
  224.          mov   DX,OFFSET copyright
  225.          mov   AH,9
  226.          INT   21H
  227. ;
  228.          MOV     AH,30H                     ;Requires DOS 2.0 or later
  229.          INT     21H
  230.  
  231.          CMP     AL,02
  232.          JAE     VER_OK
  233.  
  234.          MOV     DX,OFFSET NO_DOS
  235.          MOV     AH,9
  236.          INT     21H
  237.          INT     20H
  238. ;
  239. VER_OK:  push  DS
  240.          xor   AX,AX
  241.          push  AX
  242. ; CHECK IF ALREADY LOADED IN MEMORY
  243.          mov   WORD PTR [copyright+0],0     ;only match on executed copy
  244.          mov   WORD PTR [copyright+2],0     ;original may be in DOS buff
  245.          xor   BX,BX                        ;segment to compare
  246.          push  CS
  247.          pop   AX
  248. CHECK_LOOP:
  249.          inc   BX                           ;Next paragraph
  250.          cmp   AX,BX                        ;If in this copy of CRT_SAVE
  251.          mov   ES,BX                        ;Set for search
  252.          JE    CHECK_EGA                    ;                 then stop
  253.          mov   SI,OFFSET COPYRIGHT          ;String to compare
  254.          mov   DI,SI                        ;same offset
  255.          mov   CX,16                        ;Compare 16 bytes
  256.      REP cmpsb
  257.          or    CX,CX                        ;All matched?
  258.          JNZ   CHECK_LOOP                   ;No
  259.          mov   DX,OFFSET no_load            ;can't load again
  260.          mov   AH,9
  261.          INT   21H
  262.          RET                                ;quit
  263. CHECK_EGA:
  264.          mov   AH,12H                       ;prepare for call to int 10H
  265.          mov   BL,10H                       ;function - request EGA info
  266.          INT   10H
  267.          cmp   BL,10H                       ;BL=10H?
  268.          JE    NO_EGA                       ;yes, then no EGA installed
  269.          mov   CS:ega_flag,1
  270.          JMP   VIDEO_SET
  271. NO_EGA:
  272.          mov   AH,15                        ;get video mode
  273.          INT   10H
  274.          cmp   AL,7                         ;is it mode 7?
  275.          JNE   VIDEO_SET                    ;no, it's color
  276.          mov   CX,0B0CH                     ;fix cursor
  277.          mov   AH,1                         ;set cursor
  278.          INT   10H                          ;do it
  279. VIDEO_SET:
  280.          xor   AX,AX
  281.          mov   ES,AX                        ;base address
  282. ;
  283.          mov   SI,timer_int*4               ;timer INT 1C vector
  284.          lods  WORD PTR ES:[SI]
  285.          mov   WORD PTR TIMER_BIOS,AX       ;save
  286.          lods  WORD PTR ES:[SI]
  287.          mov   WORD PTR TIMER_BIOS+2,AX     ;save
  288. ;
  289.          mov   SI,kbd_int*4                 ;kbd INT 09 vector
  290.          lods  WORD PTR ES:[SI]
  291.          mov   WORD PTR KBD_BIOS,AX         ;save
  292.          lods  WORD PTR ES:[SI]
  293.          mov   WORD PTR KBD_BIOS+2,AX       ;save
  294. ;
  295.          mov   SI,video_int*4               ;video INT 10 vector
  296.          lods  WORD PTR ES:[SI]
  297.          mov   WORD PTR VIDEO_BIOS,AX       ;save
  298.          lods  WORD PTR ES:[SI]
  299.          mov   WORD PTR VIDEO_BIOS+2,AX     ;save
  300. ;
  301.          push  CS
  302.          pop   DS
  303.          mov   DX,OFFSET TIMER_TICK
  304.          mov   AH,25H
  305.          mov   AL,1CH
  306.          INT   21H
  307. ;
  308.          mov   DX,OFFSET KEYBOARD
  309.          mov   AH,25H
  310.          mov   AL,09H
  311.          INT   21H
  312. ;
  313.          mov   DX,OFFSET VIDEO
  314.          mov   AH,25H
  315.          mov   AL,10H
  316.          INT   21H
  317. ;
  318.          cmp   BYTE PTR DS:[80H],0          ;Any parameters?
  319.          JZ    ALL_DONE                     ;no
  320.          mov   SI,82H                       ;point at parm
  321.          cmp   BYTE PTR [SI-1],"/"
  322.          JNE   ALL_DONE
  323.          cmp   BYTE PTR [SI],"0"
  324.          JB    ALL_DONE
  325.          cmp   BYTE PTR [SI],"9"
  326.          JA    ALL_DONE
  327.          xor   CX,CX
  328.          mov   CL,[SI]
  329.          and   CL,0FH
  330.          xor   AX,AX
  331. TIME_LOOP:
  332.          add   AX,0444H
  333.          LOOP  TIME_LOOP
  334.          mov   time,AX
  335. ;
  336. ALL_DONE:
  337.          pop   DS
  338.          push  ES
  339.          MOV   AX,WORD PTR DS:[2CH]    ;Address of environment
  340.          MOV   ES,AX                   ;In ES register
  341.          MOV   AH,49H                  ;Release allocated memory
  342.          INT   21H                     ;Thru DOS
  343.          pop   ES
  344.          pop   AX
  345.          lea   DX,END_RESIDENT
  346.          INT   27H
  347. ;
  348. NO_LOAD  DB    CR,LF,"Already running...$"
  349. NO_DOS   DB    CR,LF,"Sorry, DOS 2.0 or above required...$"
  350. ;
  351. CSEG     ENDS
  352.          END   START
  353.